/*
 * ClientSocket.cpp
 *
 */

#include "ClientSocket.h"

namespace IPC {

ClientSocket::ClientSocket():Socket() {
}

ClientSocket::~ClientSocket() {
}

void  ClientSocket::connect(const std::string &server, int puerto)
{

	struct sockaddr_in	serv_addr;
	//puntero a dir del server(gethostbyname)
	struct hostent	 *ptr_server;

	// 			ALOCAR EL SOCKET Y COMUNICARSE CON EL SERVER
	//
	// 	Completar la estructura del socket "serv_addr" con la direccion del
	// 	server y port al que nos queremos connectar.
	//
	//   	Paso 1: Borrar la estructura (poner en cero)

	bzero((char *) &serv_addr, sizeof(serv_addr));

	//	Paso 2:  Inicializar familia de direcciones (protocolo IP)
	serv_addr.sin_family      = AF_INET;

	//	Paso 3: Cargar port en el socket:
	//Convertir Host-TO-Network-Short integer
	serv_addr.sin_port        = htons(puerto);

	//	Paso 4: Cargar direccion del server en el socket
	// Convertir nombre del host en su direccion
	//
	ptr_server = ::gethostbyname(server.c_str());

	// no existe: aviso y terminar
	if ( ((char *)ptr_server) == NULL )
		throw Exception("No se encontro el servidor:"+server);
	else
		memcpy(&serv_addr.sin_addr, ptr_server->h_addr, ptr_server->h_length);

	//Abrir como un socket de TCP (Internet stream socket).
	if ( (m_Fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		throw Exception("Error en la creacion del socket");

	//Conectarse al server.
	if (::connect(m_Fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
		throw Exception("Error en el connect");
}


} /* namespace IPC */
